package cn.doitedu.day07

/**
 * scala中的泛型
 * 泛型功能：1.类型约束 2.程序更加灵活
 * scala的泛型表现形式更丰富一些（花样太多了）
 *
 */

/**
 * [T <: Comparable[T]] 上界  upper bound   <T extends Comparable<T>>
 * [T >: Comparable[T]] 下界  lower bound   <T super Comparable<T>>
 * [T <% Comparable] 视图界定   view bound
 * [T : Comparable] 上下文界定 context bound
 * [-T] 逆变   方法输入参数
 * [+T] 协变   方法返回
 *
 */

class Pair[T <: Comparable[T]] {

  //传入两个类型一样的参数，返回大的
  def bigger(first: T, second: T): T = {
    if (first.compareTo(second) > 0) first else second
  }

}

object Pair {

  def main(args: Array[String]): Unit = {

    //java中的Integer实现了Comparable接口
    val p = new Pair[Integer]

    val i: Int = 1;
    val j: Int = 5
    //Int => Integer
    //implicit def int2Integer(x: Int): Integer
    val r: Integer = p.bigger(i, j) //bigger方法中传入的实际是Integer类型
    println(r)

    //scala中的Int没有实现了Comparable接口，运行会报错
    //val p2 = new Pair[Int]
//    val r2 = p2.bigger(1, 5)
//    println(r2)

  }

}
